List index is out of bounds.

Otázka od: David Michal

9. 9. 2002 16:12

Zdravim,
V programu si plnim combobox takto:

ComboBox1.Items.AddObject('neco', TObject(-2));

Pak se to snazim precist:

NejakyInteger := Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
 - zde dostanu chybu, pokud tam mam hodnotu -2

Pokud tam mam hodnotu -1 a vyssi, pak vse funguje jak ma.
Myslel jsem, ze tam mohu dat libovolne zaporne cislo odpovidaji rozsahu typu
integer.

Mate prosim nekdo vysvetleni, pouzivam Delphi6.

Diky,
David
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.385 / Virus Database: 217 - Release Date: 04/09/2002

Odpovedá: Ales Vasicek

9. 9. 2002 21:25

Ahoj,

zaporne cislo tam dat nemuzes, protoze je to Pointer a ten nemuze byt
mensi nez 0. To ze to funguje s -1 uz se tu pred nedavnem probiralo.

Ales.

> -----Original Message-----
> From: David Michal [mailto:david.michal@www-bv.com]
>
> Pak se to snazim precist:
>
> NejakyInteger :=
> Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
> - zde dostanu chybu, pokud tam mam hodnotu -2
>
> Pokud tam mam hodnotu -1 a vyssi, pak vse funguje jak ma.
> Myslel jsem, ze tam mohu dat libovolne zaporne cislo
> odpovidaji rozsahu typu
> integer.
>
> Mate prosim nekdo vysvetleni, pouzivam Delphi6.

Odpovedá: Martin Cajbik

9. 9. 2002 19:27

Pokial si pamatam, tak problem bol iba z hodnotou -1, ale mozno sa mylim.
Implementacia Items pre ComboBox, ListBox a niektore dalsie pouzivaju na
ziskavanie hodnot API funkcie, ktora v pripade, ze hodnotu nebolo mozne
ziskat vracaju -1 ako chybu.
V D6 u vsetkych takychto komponentov potom v pripade ze nastala chyba alebo
je ulozena hodnota -1 (navratova hodnota funkcie je v oboch pripadoch
rovnaka) vznikne vynimka. V D4 to niektore komponenty zase riesili tak, ze
vratili TObject(-1) aj vtedy, ked by mala vynimka skutocne vzniknut.
Tazko povedat, co je lepsie, najlepsie by snad bolo, keby si kontrolu na
rozsah urobilo Delphi samo a inak vracalo vzdy hodnotu bez vynimky. Tym by
sa vsak zase mierne spomalila praca s ulozenymi objektami a nezarucovalo by
to na 100% korektnu hodnotu.

MarCaNT (marcant@sct.sk)


> Zdravim,
> V programu si plnim combobox takto:
>
> ComboBox1.Items.AddObject('neco', TObject(-2));
>
> Pak se to snazim precist:
>
> NejakyInteger := Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
> - zde dostanu chybu, pokud tam mam hodnotu -2
>
> Pokud tam mam hodnotu -1 a vyssi, pak vse funguje jak ma.
> Myslel jsem, ze tam mohu dat libovolne zaporne cislo odpovidaji rozsahu
typu
> integer.
>
> Mate prosim nekdo vysvetleni, pouzivam Delphi6.
>
> Diky,
> David
> ---

Odpovedá: Petr Fejfar

9. 9. 2002 20:15

From: "Martin Cajbik" <cajbik@sct.sk>

> Pokial si pamatam, tak problem bol iba z hodnotou -1, ale mozno sa mylim.

Nemylis se - cteni dat je ve VCL implementovano v souladu s popisem
v SDK a vypada takhle:

function TCustomComboBoxStrings.GetObject(Index: Integer): TObject;
begin
  Result := TObject(SendMessage(ComboBox.Handle, CB_GETITEMDATA, Index, 0));
  if Longint(Result) = CB_ERR then
    Error(SListIndexError, Index);
end;

kde CB_ERR je definovana we WINDOWS.PAS jako -1. Takze pro -2 a vsechny
ostatni hodnoty by to melo byt OK a taky IMHO je.


HTH, pf


Odpovedá: Rumcajs - konference

10. 9. 2002 8:30

Pokud se snazis cist ListIndex := -2, tak samozrejme, protoze tato polozska
neexistuje
Rumcajs

> Zdravim,
> V programu si plnim combobox takto:
>
> ComboBox1.Items.AddObject('neco', TObject(-2));
>
> Pak se to snazim precist:
>
> NejakyInteger := Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
> - zde dostanu chybu, pokud tam mam hodnotu -2
>
> Pokud tam mam hodnotu -1 a vyssi, pak vse funguje jak ma.
> Myslel jsem, ze tam mohu dat libovolne zaporne cislo odpovidaji rozsahu
typu
> integer.
>
> Mate prosim nekdo vysvetleni, pouzivam Delphi6.
>
> Diky,
> David



---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.384 / Virová báze: 216 - datum vydání: 21.8.2002

Odpovedá: Lstiburek Pavel

11. 9. 2002 8:58

Myslim si, problem je jinde, vzhledem k tomu, ze Objects je ukazatel na
TObject, tak zaporna hodnota hodnota bude asi vnitrnim oznacenim chyby pro
VCL.
Nedavno zde byla docela pekna diskuze, zda pouzivat tento trik. Bylo
poukazovano na to, ze to neni ciste (a meli pravdu), ale rychle a efektivni
(a meli pravdu).
Zda se, ze pro zaporne hodnoty to bude chtit prece jen vytvorit potomka
TObject a ten ukladat.

Pavel

> Od: Rumcajs - konference [mailto:konrum@seznam.cz]
> Pokud se snazis cist ListIndex := -2, tak samozrejme, protoze
> tato polozska
> neexistuje
> Rumcajs
>
> > Zdravim,
> > V programu si plnim combobox takto:
> >
> > ComboBox1.Items.AddObject('neco', TObject(-2));
> >
> > Pak se to snazim precist:
> >
> > NejakyInteger :=
> Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
> > - zde dostanu chybu, pokud tam mam hodnotu -2
> >
> > Pokud tam mam hodnotu -1 a vyssi, pak vse funguje jak ma.
> > Myslel jsem, ze tam mohu dat libovolne zaporne cislo
> odpovidaji rozsahu
> typu
> > integer.
> >
> > Mate prosim nekdo vysvetleni, pouzivam Delphi6.
> >
> > Diky,
> > David

Odpovedá: Lebeda David

11. 9. 2002 15:32

> Myslim si, problem je jinde, vzhledem k tomu, ze Objects je ukazatel
> na TObject, tak zaporna hodnota hodnota bude asi vnitrnim oznacenim
> chyby pro VCL. Nedavno zde byla docela pekna diskuze, zda pouzivat
> tento trik. Bylo poukazovano na to, ze to neni ciste (a meli pravdu),
> ale rychle a efektivni (a meli pravdu). Zda se, ze pro zaporne hodnoty
> to bude chtit prece jen vytvorit potomka TObject a ten ukladat.

Presne tak. Se zapornymi cisly jsem rovnez naprosto neuspel. Je
pravda, ze pri alokovani potomka TObject je potreba davat pozor na
to, aby se nezapominalo na jeho dealokovani. I kdyz jsem se snazil,
stejne mi Memproof nasel spoustu situaci, kdy jsem to opomnel.

David Lebeda